
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

/*Estrutura usada na tranposicao*/
typedef struct transp{
	char *key;
	char *code;
}Transp_t;


/*Pre-condicao: Deve-se passar o nome do arquivo a ser lido (fileName)
  Pos-condicao: Retorna todo a arquivo lido numa string char*
*/
char *ReadFile(char *fileName){
	FILE *fp = NULL;
	char *str = NULL, *aux = NULL;
	
	/*abre o arquivo e trata possivel erro*/
	fp = fopen(fileName, "r");
	if(fp == NULL) { fprintf(stderr, "%s\n", "Nao foi possivel abrir o arquivo"); return NULL; }
	
	/*Iniciando variaveis*/
	aux = (char*) malloc(sizeof(char) * 101);
	str = (char*) malloc(sizeof(char));
	str[0] = '\0';
	
	/*le e armazena todo o arquivo*/
	do{
		fgets(aux, 101, fp);
		str = (char*) realloc(str, (strlen(str) + strlen(aux) + 1)* sizeof(char));
		strcat(str, aux);/*concatena a string recem lida, aux, com o resto lido*/
	}while(!feof(fp));
	
	free(aux);
	
	return str;
}/*fim ReadFile*/

/*Cifra de Cesar, K = 5*/
void CesarCode(char *str){
	int size;
	int i;
	
	/*Tratamento de erro*/
	if(str == NULL) { return; }
	
	size = strlen(str);
	for(i = 0; i < size; i++){ str[i] = str[i] + 5; }

}/*fim CesarCode*/

/*Decifra a Cifra de Cesar*/
void CesarDecode(char *str){
	int size;
	int i;
	
	/*Tratamento de erro*/
	if(str == NULL) { return; }
	
	size = strlen(str);
	for(i = 0; i < size; i++){ str[i] = str[i] - 5; }

}/*fim CesarDecode*/

/*Pre-Condicao: Informar a chave key
Transposicao com Chave*/
char *Transposition(char *key, char *str){
	Transp_t t;
	char **aux = NULL;
	int size, i, j, remainder, div, pos;
	
	/*Tratamento de erros*/
	if(str == NULL) { fprintf(stderr, "%s", "str nao pode ser NULL\n"); return NULL; }
	if(key == NULL) { fprintf(stderr, "%s", "Chave nao pode ser NULL\n"); return NULL; }
	
	/*Iniciando as variaveis*/
	size = strlen(key);
	aux = (char**) malloc(sizeof(char*) * strlen(key));
	
	div = size / strlen(key); /*quantidade de linhas completas*/
	remainder = size % strlen(key); /*quantidade de elementos na ultima linha*/
	
	/*Aloca os tamanhos das string*/
	for(i = 0; remainder > 0; i++){
		aux[i] = (char*) malloc(sizeof(char) * (div+2));
		remainder--;
	}/*fim for*/
	for(; i < size; i++){ aux[i] = (char*) malloc(sizeof(char) * (div+1)); }
	
	/*cria a tabela a partir da chave*/
	for(i = 0; i < strlen(key); i++){
		pos = 0;
		for(j = 0; pos < size;j++){
			aux[i][j] = str[pos];
			pos + strlen(key);
		}/*fim for*/
	}/*fim for*/
	
	
	

}/*fim Transposition*/


